﻿using System;

/// <summary>
/// 用于学习运算符的项目
/// </summary>
namespace 运算符
{
    class Program
    {
        static void Main(string[] args)
        {
            //1. 算术运算符 : + - × ÷ % ++ --
            // ++ 自增 ； -- 自减  : 先运算在赋值 或者 先赋值再运算 ，区别在于 符号在变量的前方或者后方
            //2. 关系运算符：> 、>=、 <、 <= 、 == 、!=
            //3. 逻辑运算符： && 、||、 ！
            //4. 赋值运算符： = 、+=、-=、 *= 、/=、%=
            int b = 11;
            int a = 10;

            Console.WriteLine(a + b);
            Console.WriteLine(a - b);
            Console.WriteLine(a * b); //* 星号代表 乘号
            Console.WriteLine(a / b);
            Console.WriteLine(a % b); //两数相除，除不尽的情况下余下来的数叫余数 ，用 % 运算符取这个值

            Console.WriteLine("--------- a++ -------");
            var c = a++;
            Console.WriteLine(c);
            Console.WriteLine(a++); //a++先赋值再自增，在下一个逻辑中生效 ，在下一次获取它的时候生效
            Console.WriteLine(a);

            Console.WriteLine("-------- ++a --------");
            Console.WriteLine(a);
            Console.WriteLine(++a);
            Console.WriteLine(a);
            Console.WriteLine("----------------");

            Console.WriteLine("--------------- a-- -------------");
            Console.WriteLine(a);
            Console.WriteLine(a--); //自减，改变发生在下一个逻辑中
            Console.WriteLine(a);

            Console.WriteLine("--------------- --a -------------");
            Console.WriteLine(a);
            Console.WriteLine(--a); //自减，改变立刻发生
            Console.WriteLine(a);

            //关系运算符：== 、!=  、>、<、>=、<=
            int d = 10;
            int e = 11;
            Console.WriteLine(d == e); //false
            Console.WriteLine(d != e); //true
            Console.WriteLine(d > e);//false
            Console.WriteLine(d < e);// true
            int f = 11;
            int g = 11;
            Console.WriteLine(f>=g); //true
            g = 12;
            Console.WriteLine(f<=g);//true

            Console.WriteLine("--------------------逻辑运算符 - --------");
            //逻辑运算符 ：&&、|| 、！
            bool ab = true;
            bool bb = false;
            Console.WriteLine(ab&&bb);//false  ，多个断言同时成立
            Console.WriteLine(ab||bb); //true ，多个断言任意一个成立即可
            Console.WriteLine(!ab ); //false 对原有的判定结果取反，如果是True 就翻转成 false
            Console.WriteLine(!bb); //true

            //赋值运算符： = 、+=、-=、*=、/= 、%=
            int cf = 10;
            Console.WriteLine(cf+=5);//15
            Console.WriteLine(cf-=6);//9
            Console.WriteLine(cf/=3);//3
            //剩下的自己写


            //其他运算符：?: 三目运算 ， is 判定是否为你指定的类型 ，as 类型的强制转换
            // sizeof  ,size 尺寸 of 对于什么 求一个东西的尺寸
            // typeof  type 类型 of ... ，返回对象的类型
            bool 有钱 = true;
            var result = 有钱 ? "喝咖啡" : "白开水";
            Console.WriteLine(result);
            object o =GetClass();
            Console.WriteLine(o is MyClass); //true
            Console.WriteLine(o is MyClassSon); //true
            if (o is MyClassSon son)
            {
                Console.WriteLine($"son.age = {son.age}");
            }

            Console.WriteLine(o is Program); //false
            //Console.WriteLine(o.age); //不能直接获取类型中的 age 字段 ，需要涉及类型转换
            Console.WriteLine((o as MyClassSon).age);  // 将 object 转 MyClassSon
            Console.WriteLine(((MyClassSon)o).age);

            Console.WriteLine(typeof(MyClass));//获取一个类的类型（获取你的type信息），返回的 Type
            var t = typeof(MyClassSon);
            Console.WriteLine(t.BaseType);

            Console.WriteLine(sizeof(int)); //返回数据类型的大小， 4
            Console.WriteLine(sizeof(long)); // 8
            Console.WriteLine(sizeof(short));//2

            Console.WriteLine("Hello World!");
        }
       static object GetClass() 
        {
            return new MyClassSon();
        }
    }

    class MyClass
    {
    }

    class MyClassSon:MyClass
    {
       public int age;
       public MyClassSon() 
        {
            age = 100;
        }
    }

}
